package com.sam.questionBank;

import java.util.ArrayList;
import java.util.List;


/**
 *  二进制手表
 *  二进制手表顶部有 4 个 LED 代表小时（0-11），底部的 6 个 LED 代表分钟（0-59）。
 每个 LED 代表一个 0 或 1，最低位在右侧。

 给定一个非负整数 n 代表当前 LED 亮着的数量，返回所有可能的时间。

 案例:
 输入: n = 1
 返回: ["1:00", "2:00", "4:00", "8:00", "0:01", "0:02", "0:04", "0:08", "0:16", "0:32"]


 注意事项:
 输出的顺序没有要求。
 小时不会以零开头，比如 “01:00” 是不允许的，应为 “1:00”。
 分钟必须由两位数组成，可能会以零开头，比如 “10:2” 是无效的，应为 “10:02”。

 * Created by samwang on 2018/4/7.
 */
public class ReadBinaryWatch {

    public static void main(String[] args) {
        ReadBinaryWatch temp = new ReadBinaryWatch();
        temp.readBinaryWatch(2);
    }

    public List<String> readBinaryWatch(int num) {
        List<String> list = new ArrayList<>();
        byte[] temp = new byte[10];
        binaryWatch(list,num,temp,0,0);
        System.out.println(list);
        return list;
    }


    private void binaryWatch(List<String> list,int num, byte[] data, int lightCount, int useCount) {
        if(lightCount == num) {
            printTime(list,data,useCount);
        }else if(useCount <10){
            data[useCount]=1;
            binaryWatch(list,num,data,lightCount+1,useCount+1);
            data[useCount]=0;
            binaryWatch(list,num,data,lightCount,useCount+1);
        }

    }

    private void printTime(List<String> list, byte[] data,int useCount) {
        int hour = 0;
        for (int i = 0; i < Math.min(4, useCount); i++) {
            hour += (data[i] << (3 - i));
        }
        if (hour > 11) {
            return;
        }
        int minute =0;
        for(int i = 4 ;i<useCount;i++) {
            minute += (data[i] << (9 - i));
        }
        if(minute >59) {
            return ;
        }
        list.add(hour+(minute<10?":0"+minute:":"+minute));
    }

}
